package com.zjny.util;

import cn.hutool.extra.spring.SpringUtil;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;

/**
 * <p>
 * spring 工具类
 * </p>
 *
 * @author cui haida
 * @date 2024/04/30/9:40
 */
public class SpringUtils extends SpringUtil {
    /**
     * 如果BeanFactory包含一个与所给名称匹配的bean定义，则返回true
     */
    public static boolean containsBean(String name) {
        return getBeanFactory().containsBean(name);
    }

    /**
     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
     * 如果与给定名字相应的bean定义没有被找到，将会抛出一个异常（NoSuchBeanDefinitionException）
     */
    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return getBeanFactory().isSingleton(name);
    }

    /**
     * @param name bean名称
     * @return Class 注册对象的类型
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return getBeanFactory().getType(name);
    }

    /**
     * 如果给定的bean名字在bean定义中有别名，则返回这些别名
     */
    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
        return getBeanFactory().getAliases(name);
    }


    /**
     * 获取spring上下文
     */
    public static ApplicationContext context() {
        return getApplicationContext();
    }

    /**
     * 获取spring bean
     *
     * @param clazz bean类型
     * @param <T>   声明该方法是一个泛型方法
     * @return bean对象
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 获取spring bean
     *
     * @param name bean名称
     * @return bean对象
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 获取spring bean
     *
     * @param name   bean名称
     * @param clazz  bean类型
     * @param <T>    声明该方法是一个泛型方法
     * @return bean对象
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

    /**
     * 移除spring bean
     *
     * @param beanName bean名称
     */
    public static void removeBean(String beanName) {
        getApplicationContext().getAutowireCapableBeanFactory().destroyBean(beanName);
    }

    /**
     * 移除spring bean
     *
     * @param clazz bean类型
     */
    public static <T> void removeBean(Class<T> clazz) {
        removeBean(clazz.getName());
    }
}
